/*
 * cleaner.h
 *
 *  Created on: 2017年9月23日
 *      Author: xzl
 */

#ifndef SRC_CLEANER_H_
#define SRC_CLEANER_H_

#include <list>
#include <mutex>
#include <functional>
using namespace std;


class cleaner {
public:
	cleaner(){}
	virtual ~cleaner(){
		lock_guard<recursive_mutex> lck(_mtx);
		for(auto &fun : _cleanInvokerList){
			fun();
		}
		_cleanInvokerList.clear();
	}
	static cleaner &Instance(){
		static cleaner *instance(new cleaner);
		return *instance;
	}
	static void Destory(){
		delete &Instance();
	}
	template<typename FUN>
	void push_front(FUN &&fun){
		lock_guard<recursive_mutex> lck(_mtx);
		_cleanInvokerList.push_front(fun);
	}

	template<typename FUN>
	void push_back(FUN &&fun){
		lock_guard<recursive_mutex> lck(_mtx);
		_cleanInvokerList.push_back(fun);
	}

private:
	recursive_mutex _mtx;
	list<function<void()> > _cleanInvokerList;
};

#endif /* SRC_CLEANER_H_ */
